package interfacesFerrovia;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Interface para acesso aos comandos da rede ferrovi�ria.
 * 
 * @author Fernando Vanini
 * 
 */

public interface ControleFerrovia extends DefsGlobais {

	/**
	 * Registra um tratador para os eventos gerados pela rede ferrovi�ria.
	 * Pode-se registrar mais de um tratador
	 * 
	 * @param tratador
	 *            Objeto que implementa a interface TratadorDeEventos.
	 * @return true se o registro for feito normalmente.
	 */
	public boolean registraTratadorDeEventos(TratadorDeEventos tratador);

	/**
	 * Consulta aos elementos da rede. Retorna uma lista contendo os id's dos
	 * elementos da rede.
	 * 
	 * @return lista contendo os id's dos elementos da rede.
	 */
	public String[] consultaElementos();

	/**
	 * Consulta os atributos fixos de um elemento da rede.
	 * 
	 * @param idElemento
	 *            identifica��o �nica do elemento.
	 * @return mapa <atributo,valor> contendo os atributos fixos do elemento.
	 */
	public Map<TipoAtributo, Object> consultaAtributosFixos(String idElemento);

	/**
	 * Consulta o estado (formado pelo conjunto de atributos vari�veis) de um
	 * elemento da rede.
	 * 
	 * @param idElemento
	 *            identifica��o �nica do elemento.
	 * @return mapa <atributo,valor> que caracteriza o estado do elemento.
	 */
	public Map<TipoAtributo, Object> consultaEstado(String idElemento);

	/**
	 * Consulta um atributo de um elemento da rede.
	 * 
	 * @param idElemento
	 *            Identifica��o �nica do elemento
	 * @param atributo
	 *            Nome do atributo a ser consultado
	 * @return Object Valor do atributo
	 */
	public Object consultaAtributo(String idElemento, TipoAtributo atributo);

	/**
	 * Consulta o conjunto de atributos de um dado elemento da rede.
	 * 
	 * @param idElemento
	 *            Identifica��o �nica do elemento da rede.
	 * @return Conjunto de atributos (fixos e vari�veis) associados ao elemento.
	 */
	public Set<TipoAtributo> consultaListaDeAtributos(String idElemento);

	/**
	 * Comando para acelerar uma composic�o.
	 * 
	 * @param idComposicao
	 *            Identifica��o �nica da composi��o.
	 * @param velocidade
	 *            Velocidade a ser atingida.
	 * @param urgente
	 *            Urgente(true) ou normal(false).
	 * @return Tempo necess�rio para atingir a velocidade.
	 */
	public int acelerarComposicao(String idComposicao, float velocidade,
			boolean urgente);

	/**
	 * Comando para acelerar a composicao
	 * 
	 * @param idComposicao
	 *            Identifica��o �nica da composi��o
	 * @param velocidade
	 *            Velocidade a ser atingida
	 * @param acel
	 *            Taxa de acelera��o
	 * @return Tempo necess�rio para atingir a velocidade
	 */
	public int acelerarComposicao(String idComposicao, float velocidade,
			float acel);

	/**
	 * Comando para frear a composi��o.
	 * 
	 * @param idComposicao
	 *            Identifica��o �nica da composi��o.
	 * @param velocidade
	 *            Velocidade a ser atingida
	 * @param urgente
	 *            Urgente(true) ou normal(false).
	 * @return Tempo necess�rio para realizar a opera��o.
	 */
	public int frearComposicao(String idComposicao, float velocidade,
			boolean urgente);

	/**
	 * Comando para frear a composi��o
	 * 
	 * @param idComposicao
	 *            Identifica��o �nica da composi��o.
	 * @param velocidade
	 *            Velocidade a ser atingida.
	 * @param fren
	 *            Taxa de frenagem aplicada.
	 * @return Tempo necess�rio para realizar a opera��o.
	 */
	public int frearComposicao(String idComposicao, float velocidade, float fren);

	/**
	 * COnsulta a posi��o prevista para um instante futuro.
	 * 
	 * @param idComposicao
	 *            Identifica��o �nica da composi��o.
	 * @param instante
	 *            Instante futuro a ser considerado.
	 * @return A posi��o prevista, no trecho atual.
	 */
	public float consultaPosicao(String idComposicao, int instante);

	/**
	 * Consulta o tempo previsto para atingir uma dada posi��o no trecho atual
	 * (considerando a velocidade e taxa de acelera��o ou frenagem atuais).
	 * 
	 * @param idComposicao
	 *            Identifica��o �nica da composi��o.
	 * @param posicao
	 *            Posi��o a ser atingida.
	 * @return Tempo estimado necess�rio para atingir a posi��o.
	 */
	public int consultaTempo(String idComposicao, float posicao);

	/**
	 * Calcula a dist�ncia m�nima necess�ria � parada de uma composi��o.
	 * 
	 * @param idComposicao
	 *            Identifica��o �nica da composi��o.
	 * @return Dist�ncia m�nima necess�ria � parada da composi��o.
	 */
	public float consultaDistMinParada(String idComposicao);

	@SuppressWarnings("unchecked")
	public List consultaCoordenadas(String idTrecho);

	/**
	 * Comando para mudar o estado de uma chave.
	 * 
	 * @param idChave
	 *            Identifica��o �nica da chave
	 * @param idTrechoA
	 *            Identifica��o do trecho a ser conectado � extremidade A da
	 *            chave.
	 * @param idTrechoB
	 *            Identifica��o do trecho a ser conectado � extremidade B da
	 *            chave.
	 * @return True se a opera��o pode ser realizada.
	 */
	public boolean mudarChave(String idChave, String idTrechoA, String idTrechoB);

	/**
	 * Define a resolu��o do rel�gio do simulador (intervalo entre tics).
	 * (default: 15s, habilitado = false)
	 * 
	 * @param intervalo
	 *            Intervalo entre cada tic
	 * @param habilitado
	 *            Indica se o simulador gera ou n�o o evento relativo ao tic.
	 */
	// public void defineTic(int intervalo, boolean habilitado); eliminado =>
	// ser� sempre 1 !!!!

	/**
	 * Define o cen�rio a ser usado na simula��o.
	 * 
	 * @param cenario
	 *            Indica o cen�rio a ser usado (0..nCenarios-1)
	 */
	public void defineCenario(int cenario);

	/**
	 * Simula um cen�rio pr�-definido, formado por um conjunto de elementos de
	 * rede.
	 * 
	 * @param t1
	 *            Instante de in�cio da simula��o (quase sempre zero).
	 * @param t2
	 *            Instante de t�rmino da simula��o.
	 * @throws Exception
	 */
	public void simularCenario(int t1, int t2) throws Exception;

}
